﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;

namespace TumbaloSoft.Controllers
{
    public class AdministradorGeneralController : TumbaloController
    {
        //
        // GET: /AdministradorGeneral/
        private static Object lockObject = new Object();


        public ActionResult Index(BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;

            try
            {


                numActivos = HelperPersonaNatural.selectCountActivosAdministradorGeneral();
                ViewBag.ListaAdministradorGeneral = HelperPersonaNatural.buscarAdministradorGeneral(personaNaturalBuscar);

                ViewBag.prevPage = personaNaturalBuscar.prPage - 1;
                ViewBag.nextPage = personaNaturalBuscar.prPage + 1;
                ViewBag.numPages = numActivos / personaNaturalBuscar.prPageSize;
                if ((numActivos % personaNaturalBuscar.prPageSize) > 0) ViewBag.numPages++;

                return View(personaNaturalBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al visualizar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        public ActionResult Registrar()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar un administrador general", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        [HttpPost]

        public ActionResult Registrar(PersonaNatural personaNatural, string prSexo)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                TipoDocumento ti = (TipoDocumento)HelperTipoDocumento.selectById(personaNatural.prTipoDocumento.prIdTipoDocumento);
                personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                personaNatural.prIdTipoPersona = 5;
                personaNatural.prTipoDocumento = ti;
                personaNatural.prEstado = "ACTIVO";
                personaNatural.prSexo = prSexo;



                Boolean existe = HelperPersonaNatural.ExistePersona(personaNatural.prCodigoDocumento);
                Boolean esMayor = EsMayorEdad(personaNatural.prFechaNacimiento);
                if (existe == true)
                {
                    ModelState.AddModelError("prCodigoDocumento", "Ya existe la persona");
                    return View(personaNatural);
                }
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(personaNatural);
                }
                else if (ModelState.IsValid)
                {
                    lock (lockObject)
                    {
                        personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                        HelperPersonaNatural.insert(personaNatural);
                        AccountController.crearCuenta(personaNatural, 3);
                    }
                    ViewBag.mensaje = "Se registro correctamente al Administrador General " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                    ViewBag.returnURL = "/AdministradorGeneral/Index";
                    return View("~/Views/Shared/Exito.cshtml");

                }


                else return View(personaNatural);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al registrar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }



        public Boolean EsMayorEdad(DateTime fechaNacimiento)
        {

            int edad = DateTime.Today.Year - fechaNacimiento.Year;
            if (new DateTime(DateTime.Today.Year, fechaNacimiento.Month, fechaNacimiento.Day) > DateTime.Today) edad--;
            if (edad > 18 && edad < 65) return true;
            else return false;

        }


        public ActionResult Modificar(int? prIdPersona, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);

                if (!prIdPersona.HasValue)
                {
                    return View();
                }

                else
                {
                    ViewBag.ListaAdministradorGeneral = HelperPersonaNatural.buscarAdministradorGeneral(personaNaturalBuscar);
                    PersonaNatural personaNatural = HelperPersonaNatural.selectById(prIdPersona.Value);
                    if (personaNatural == null) return View();

                    return View(personaNatural);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al modificar el administrador general", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }


        [HttpPost]
        public ActionResult Modificar(PersonaNatural personaNatural, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.ListaAdministradorGeneral = HelperPersonaNatural.buscarAdministradorGeneral(personaNaturalBuscar);
                personaNatural.prIdTipoPersona = 5;
                Boolean esMayor = EsMayorEdad(personaNatural.prFechaNacimiento);
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(personaNatural);
                }

                else if (ModelState.IsValid)
                {
                    HelperPersonaNatural.update(personaNatural);
                    ViewBag.mensaje = "Se modifico correctamente al Administrador General " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                    ViewBag.returnURL = "/AdministradorGeneral/Index";
                    return View("~/Views/Shared/Exito.cshtml");

                }
                else return View(personaNatural);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al modificar administrador general", ex);
                return View("~/Views/Shared/Error.cshtml");
            }


        }

        /*-----------------Eliminar Administrador General-------------------------------*/


        public ActionResult Eliminar(int? prIdPersona, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                ViewBag.ListaAdministradorGeneral = HelperPersonaNatural.buscarAdministradorGeneral(personaNaturalBuscar);

                if (!prIdPersona.HasValue)
                {
                    return View();
                }

                else
                {
                    ViewBag.ListaAdministradorGeneral = HelperPersonaNatural.buscarAdministradorGeneral(personaNaturalBuscar);
                    PersonaNatural personaNatural = HelperPersonaNatural.selectById(prIdPersona.Value);
                    if (personaNatural == null) return View();
                    return View(personaNatural);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al eliminar Administrador General", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }


        [HttpPost]
        public ActionResult Eliminar(PersonaNatural personaNatural)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                HelperPersonaNatural.delete(personaNatural);
                ViewBag.mensaje = "Se elimino correctamente al Administrador General " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                ViewBag.returnURL = "/AdministradorGeneral/Index";
                return View("~/Views/Shared/Exito.cshtml");


            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al eliminar administrador general", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }




    }
}
